unit UserPermis_U;

interface

{$I 'UserControl.inc'}

uses
  UCBase,
  {.$IFDEF UCACTMANAGER}
  ActnMan,
  ActnMenus,
  {.$ENDIF}
  {.$IFDEF DELPHI5_UP}
  Variants,
  {.$ENDIF}
  Buttons,
  Classes,
  ComCtrls,
  Controls,
  DB,
  ExtCtrls,
  Forms,
  Graphics,
  ImgList,
  Menus,
  StdCtrls;

type
  PTreeMenu = ^TTreeMenu;

  TTreeMenu = record
    Selecionado: Integer;
    MenuName:    String;
  end;

  PTreeAction = ^TTreeAction;

  TTreeAction = record
    Grupo:       Boolean;
    Selecionado: Integer;
    MenuName:    String;
  end;

  PTreeControl = ^TTreeControl;

  TTreeControl = record
    Grupo:       Boolean;
    Selecionado: Integer;
    CompName:    String;
    FormName:    String;
  end;

  TUserPermis = class(TForm)
    Panel1:       TPanel;
    LbDescricao:  TLabel;
    Image1:       TImage;
    Panel3:       TPanel;
    BtLibera:     TBitBtn;
    BtBloqueia:   TBitBtn;
    BtGrava:      TBitBtn;
    lbUser:       TLabel;
    ImageList1:   TImageList;
    BtCancel:     TBitBtn;
    PC:           TPageControl;
    PageMenu:     TTabSheet;
    PageAction:   TTabSheet;
    TreeMenu:     TTreeView;
    TreeAction:   TTreeView;
    PageControls: TTabSheet;
    TreeControls: TTreeView;
    procedure BtGravaClick(Sender: TObject);
    procedure TreeMenuClick(Sender: TObject);
    procedure BtCancelClick(Sender: TObject);
    procedure BtLiberaClick(Sender: TObject);
    procedure BtBloqueiaClick(Sender: TObject);
    procedure FormShow(Sender: TObject);
    procedure TreeActionClick(Sender: TObject);
    procedure TreeControlsClick(Sender: TObject);
    procedure TreeMenuCollapsing(Sender: TObject; Node: TTreeNode; var AllowCollapse: Boolean);
    procedure TreeMenuKeyPress(Sender: TObject; var Key: char);
    procedure TreeMenuMouseUp(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
    procedure FormDestroy(Sender: TObject);
  private
    FMenu:              TMenu;
    FActions:           TObject;
    FChangingTree:      Boolean;
    FTempMPointer:      PTreeMenu;
    FTempAPointer:      PTreeAction;
    FTempCPointer:      PTreeControl;
    FExtraRights:       TUCExtraRights;
    FTempLista:         TStringList;
    FListaAction:       array of PTreeAction;
    FListaMenu:         array of PTreeMenu;
    FListaControl:      array of PTreeControl;
    {.$IFDEF UCACTMANAGER}
    FActionMainMenuBar: TActionMainMenuBar;
    procedure TrataItem(IT: TActionClientItem; node: TTreeNode); overload;
    {.$ENDIF}
    procedure TrataItem(IT: TMenuItem; node: TTreeNode); overload;
    procedure TreeMenuItem(marca: Boolean);
    procedure Atualiza(Selec: Boolean);
    procedure TreeActionItem(marca: Boolean);
    procedure UnCheckChild(node: TTreeNode);
    procedure TreeControlItem(marca: Boolean);
    procedure CarregaTreeviews;
  public
    FTempIdUser:  Integer;
    FUserControl: TUserControl;
    DSPermiss:    TDataset;
    DSPermissEX:  TDataset;
    DSPerfil:     TDataset;
    DSPerfilEX:   TDataset;
  end;

var
  UserPermis: TUserPermis;

implementation

uses
  ActnList,
  Messages,
  SysUtils,
  Windows;

{$R *.dfm}

procedure TUserPermis.BtGravaClick(Sender: TObject);
var
  Contador: Integer;
begin
  with fUserControl.TableRights do
  begin
    fUserControl.DataConnector.UCExecSQL('Delete from ' + TableName + ' Where ' + FieldUserID + ' = ' + IntToStr(FTempIdUser) + ' and ' + FieldModule + ' = ' + QuotedStr(fUserControl.ApplicationID));
    fUserControl.DataConnector.UCExecSQL('Delete from ' + TableName + 'EX Where ' + FieldUserID + ' = ' + IntToStr(FTempIdUser) + ' and ' + FieldModule + ' = ' + QuotedStr(fUserControl.ApplicationID));
  end;

  for Contador := 0 to TreeMenu.Items.Count - 1 do
    if PTreeMenu(TreeMenu.Items[Contador].Data).Selecionado = 1 then
      fUserControl.AddRight(FTempIdUser, PTreeMenu(TreeMenu.Items[Contador].Data).MenuName);

  for Contador := 0 to TreeAction.Items.Count - 1 do
    if PTreeAction(TreeAction.Items[Contador].Data).Selecionado = 1 then
      fUserControl.AddRight(FTempIdUser, PTreeAction(TreeAction.Items[Contador].Data).MenuName);

  //Extra Rights
  for Contador := 0 to Pred(TreeControls.Items.Count) do
    if PTreeControl(TreeControls.Items[Contador].Data).Selecionado = 1 then
      fUserControl.AddRightEX(FTempIdUser, fUserControl.ApplicationID, PTreeControl(TreeControls.Items[Contador].Data).FormName, PTreeControl(TreeControls.Items[Contador].Data).CompName);

  Close;
end;

procedure TUserPermis.TrataItem(IT: TMenuItem; node: TTreeNode);
var
  contador: Integer;
  TempNode: TTreeNode;
begin
  for contador := 0 to IT.Count - 1 do
    if IT.Items[Contador].Caption <> '-' then
      if IT.Items[Contador].Count > 0 then
      begin
        New(FTempMPointer);
        SetLength(FListaMenu, Length(FListaMenu) + 1);  //Adicionado por Luiz 18/01/06
        FListaMenu[High(FListaMenu)] := FTempMPointer;  //Adicionado por Luiz 18/01/06
        FTempMPointer.Selecionado    := 0;
        FTempMPointer.MenuName       := IT.Items[Contador].Name;
        TempNode                     := TreeMenu.Items.AddChildObject(node, StringReplace(IT.Items[Contador].Caption, '&', '', [rfReplaceAll]), FTempMPointer);
        TrataItem(IT.Items[Contador], TempNode);
      end
      else
      begin
        New(FTempMPointer);
        SetLength(FListaMenu, Length(FListaMenu) + 1);  //Adicionado por Luiz 18/01/06
        FListaMenu[High(FListaMenu)] := FTempMPointer;  //Adicionado por Luiz 18/01/06
        FTempMPointer.Selecionado    := 0;
        FTempMPointer.MenuName       := IT.Items[Contador].Name;
        TreeMenu.Items.AddChildObject(node, StringReplace(IT.Items[Contador].Caption, '&', '', [rfReplaceAll]), FTempMPointer);
      end;
end;

{.$IFDEF UCACTMANAGER}
procedure TUserPermis.TrataItem(IT: TActionClientItem; node: TTreeNode);
var
  contador: Integer;
  TempNode: TTreeNode;
begin
  for contador := 0 to IT.Items.Count - 1 do
    if IT.Items[Contador].Caption <> '-' then
      if IT.Items[Contador].Items.Count > 0 then
      begin
        New(FTempMPointer);
        SetLength(FListaMenu, Length(FListaMenu) + 1);  //Adicionado por Luiz 18/01/06
        FListaMenu[High(FListaMenu)] := FTempMPointer;  //Adicionado por Luiz 18/01/06
        FTempMPointer.Selecionado    := 0;
        FTempMPointer.MenuName       := #1 + 'G' + IT.Items[Contador].Caption;
        TempNode                     := TreeMenu.Items.AddChildObject(node, StringReplace(IT.Items[Contador].Caption, '&', '', [rfReplaceAll]), FTempMPointer);
        TrataItem(IT.Items[Contador], TempNode);
      end
      else
      begin
        New(FTempMPointer);
        SetLength(FListaMenu, Length(FListaMenu) + 1);  //Adicionado por Luiz 18/01/06
        FListaMenu[High(FListaMenu)] := FTempMPointer;  //Adicionado por Luiz 18/01/06
        FTempMPointer.Selecionado    := 0;
        FTempMPointer.MenuName       := IT.Items[Contador].Action.Name;
        TreeMenu.Items.AddChildObject(node, StringReplace(IT.Items[Contador].Caption, '&', '', [rfReplaceAll]), FTempMPointer);
      end;
end;

{.$ENDIF}

procedure TUserPermis.CarregaTreeviews;
var
  Contador: Integer;
  TempNode: TTreeNode;
  Temp:     String;
  Temp2:    String;
  Desc:     String;
begin
  FChangingTree := False;
  PC.ActivePage := PageMenu;

{  Self.FMenu              := fUserControl.ControlRight.MainMenu;
  Self.FActionMainMenuBar := fUserControl.ControlRight.ActionMainMenuBar;
  if Assigned(fUserControl.ControlRight.ActionList) then
    Self.FActions := fUserControl.ControlRight.ActionList
  else
    Self.FActions := fUserControl.ControlRight.ActionManager; }

  Self.FMenu              := fUsercontrol.ControlRight.MainMenu;
  Self.FActionMainMenuBar := fUsercontrol.ControlRight.ActionMainMenuBar;
  if Assigned(fUsercontrol.ControlRight.ActionList) then
    Self.FActions := fUsercontrol.ControlRight.ActionList
  else
    Self.FActions := fUsercontrol.ControlRight.ActionManager;
  Self.FExtraRights := fUsercontrol.ExtraRights;

    (*if (not Assigned(FMenu)) and (not Assigned(fUserControl.ControlRight.ActionList))
        {.$IFDEF UCACTMANAGER} and (not Assigned(fUserControl.ControlRight.ActionManager)) and
        (not Assigned(fUserControl.ControlRight.ActionMainMenuBar))
      {.$ENDIF} then
      begin
        if (Assigned(FMenu))
          {.$IFDEF UCACTMANAGER} and (not Assigned(fUserControl.ControlRight.ActionMainMenuBar))
        {.$ENDIF} then*)

  //TempNode := nil;
  if Assigned(FMenu) then
  begin
    TreeMenu.Items.Clear;
    for Contador := 0 to FMenu.Items.Count - 1 do
      if FMenu.Items[Contador].Count > 0 then
      begin
        New(FTempMPointer);
        SetLength(FListaMenu, Length(FListaMenu) + 1);  //Adicionado por Luiz 18/01/06
        FListaMenu[High(FListaMenu)] := FTempMPointer;  //Adicionado por Luiz 18/01/06
        FTempMPointer.Selecionado    := 0;
        FTempMPointer.MenuName       := FMenu.Items[Contador].Name;
        TempNode                     := TreeMenu.Items.AddObject(nil, StringReplace(FMenu.Items[Contador].Caption, '&', '', [rfReplaceAll]), FTempMPointer);
        TrataItem(FMenu.Items[Contador], TempNode);
      end
      else
        if FMenu.Items[Contador].Caption <> '-' then
        begin
          New(FTempMPointer);
          SetLength(FListaMenu, Length(FListaMenu) + 1);  //Adicionado por Luiz 18/01/06
          FListaMenu[High(FListaMenu)] := FTempMPointer;  //Adicionado por Luiz 18/01/06
          FTempMPointer.Selecionado    := 0;
          FTempMPointer.MenuName       := FMenu.Items[Contador].Name;
          TreeMenu.Items.AddObject(nil, StringReplace(FMenu.Items[Contador].Caption, '&', '', [rfReplaceAll]), FTempMPointer);
        end;
    TreeMenu.FullExpand;
    TreeMenu.Perform(WM_VSCROLL, SB_TOP, 0);
  end;

  {.$IFDEF UCACTMANAGER}
  //TempNode := nil;
  if Assigned(FActionMainMenuBar) then
  begin
    TreeMenu.Items.Clear;
    for Contador := 0 to FActionMainMenuBar.ActionClient.Items.Count - 1 do
    begin
      Temp := IntToStr(Contador);
      if FActionMainMenuBar.ActionClient.Items[StrToInt(Temp)].Items.Count > 0 then
      begin
        New(FTempMPointer);
        SetLength(FListaMenu, Length(FListaMenu) + 1);  //Adicionado por Luiz 18/01/06
        FListaMenu[High(FListaMenu)] := FTempMPointer;  //Adicionado por Luiz 18/01/06
        FTempMPointer.Selecionado    := 0;
        FTempMPointer.MenuName       := #1 + 'G' + FActionMainMenuBar.ActionClient.Items[StrToInt(Temp)].Caption;
        TempNode                     := TreeMenu.Items.AddObject(nil, StringReplace(FActionMainMenuBar.ActionClient.Items[StrToInt(Temp)].Caption, '&', '', [rfReplaceAll]), FTempMPointer);
        TrataItem(FActionMainMenuBar.ActionClient.Items[StrToInt(Temp)], TempNode);
      end
      else
      begin
        New(FTempMPointer);
        SetLength(FListaMenu, Length(FListaMenu) + 1);  //Adicionado por Luiz 18/01/06
        FListaMenu[High(FListaMenu)] := FTempMPointer;  //Adicionado por Luiz 18/01/06
        FTempMPointer.Selecionado    := 0;
        FTempMPointer.MenuName       := FActionMainMenuBar.ActionClient.Items[StrToInt(Temp)].Action.Name;
        TreeMenu.Items.AddObject(nil, StringReplace(FActionMainMenuBar.ActionClient.Items[StrToInt(Temp)].Action.Name, '&', '', [rfReplaceAll]), FTempMPointer);
      end;
      TreeMenu.FullExpand;
      TreeMenu.Perform(WM_VSCROLL, SB_TOP, 0);
    end;
  end;
  {.$ENDIF}

(*if (Assigned(fUserControl.ControlRight.ActionList))
      {.$IFDEF UCACTMANAGER} or (Assigned(fUserControl.ControlRight.ActionManager))
    {.$ENDIF} then*)
    
  TempNode := nil;
  if Assigned(FActions) then
  begin
    TreeAction.Items.Clear;
    if Assigned(FTempLista) then
      FreeAndNil(FTempLista);
    FTempLista := TStringList.Create;
    for Contador := 0 to TActionList(FActions).ActionCount - 1 do
      FTempLista.Append(TActionList(FActions).Actions[contador].Category + #1 + TActionList(FActions).Actions[contador].Name + #2 + TAction(TActionList(FActions).Actions[contador]).Caption);
    FTempLista.Sort;
    Temp := #1;
    for Contador := 0 to FTempLista.Count - 1 do
    begin
      if Temp <> Copy(FTempLista[Contador], 1, Pos(#1, FTempLista[Contador]) - 1) then
      begin
        New(FTempAPointer);
        SetLength(FListaAction, Length(FListaAction) + 1);  //Adicionado por Luiz 18/01/06
        FListaAction[High(FListaAction)] := FTempAPointer;  //Adicionado por Luiz 18/01/06
        FTempAPointer.Grupo              := True;
        FTempAPointer.Selecionado        := 0;
        FTempAPointer.MenuName           := 'Grupo';
        TempNode                         := TreeAction.Items.AddObject(nil, StringReplace(Copy(FTempLista[Contador], 1, Pos(#1, FTempLista[Contador]) - 1), '&', '', [rfReplaceAll]), FTempAPointer);
        TempNode.ImageIndex              := 2;
        TempNode.SelectedIndex           := 2;
        Temp                             := Copy(FTempLista[Contador], 1, Pos(#1, FTempLista[Contador]) - 1);
      end;
      Temp2 := FTempLista[Contador];
      Delete(Temp2, 1, pos(#1, Temp2));
      New(FTempAPointer);
      SetLength(FListaAction, Length(FListaAction) + 1);  //Adicionado por Luiz 18/01/06
      FListaAction[High(FListaAction)] := FTempAPointer;  //Adicionado por Luiz 18/01/06
      FTempAPointer.Grupo              := False;
      FTempAPointer.Selecionado        := 0;
      FTempAPointer.MenuName           := Copy(Temp2, 1, Pos(#2, Temp2) - 1);
      Delete(Temp2, 1, pos(#2, Temp2));
      TreeAction.Items.AddChildObject(TempNode, StringReplace(Temp2, '&', '', [rfReplaceAll]), FTempAPointer);
    end;
    TreeAction.FullExpand;
    TreeAction.Perform(WM_VSCROLL, SB_TOP, 0);
  end;

  //ExtraRights
  TempNode := nil;
  if Self.FExtraRights.Count > 0 then
  begin
    TreeControls.Items.Clear;
    if Assigned(FTempLista) then
      FreeAndNil(FTempLista);
    FTempLista := TStringList.Create;
    for Contador := 0 to Pred(FExtraRights.Count) do
      FTempLista.Append(FExtraRights[Contador].GroupName + #1 + FExtraRights[Contador].Caption + #2 + FExtraRights[Contador].FormName + #3 + FExtraRights[Contador].CompName);
    FTempLista.Sort;
    Temp := #1;
    for Contador := 0 to Pred(FTempLista.Count) do
    begin
      if Temp <> Copy(FTempLista[Contador], 1, Pos(#1, FTempLista[Contador]) - 1) then
      begin
        New(FTempCPointer);
        SetLength(FListaControl, Length(FListaControl) + 1);  //Adicionado por Luiz 18/01/06
        FListaControl[High(FListaControl)] := FTempCPointer;  //Adicionado por Luiz 18/01/06
        FTempCPointer.Grupo                := True;
        FTempCPointer.Selecionado          := 0;
        FTempCPointer.FormName             := 'Grupo';
        FTempCPointer.CompName             := 'Grupo';
        TempNode                           := TreeControls.Items.AddObject(nil, Copy(FTempLista[Contador], 1, Pos(#1, FTempLista[Contador]) - 1), FTempCPointer);
        TempNode.ImageIndex                := 2;
        TempNode.SelectedIndex             := 2;
        Temp                               := Copy(FTempLista[Contador], 1, Pos(#1, FTempLista[Contador]) - 1);
      end;
      Temp2 := FTempLista[Contador];
      Delete(Temp2, 1, pos(#1, Temp2));
      New(FTempCPointer);
      SetLength(FListaControl, Length(FListaControl) + 1);  //Adicionado por Luiz 18/01/06
      FListaControl[High(FListaControl)] := FTempCPointer;  //Adicionado por Luiz 18/01/06
      FTempCPointer.Grupo                := False;
      FTempCPointer.Selecionado          := 0;
      Desc                               := Copy(Temp2, 1, Pos(#2, Temp2) - 1); // descricao do objeto
      Delete(Temp2, 1, pos(#2, Temp2));

      FTempCPointer.FormName := Copy(Temp2, 1, Pos(#3, Temp2) - 1);
      Delete(Temp2, 1, pos(#3, Temp2));
      FTempCPointer.CompName := Temp2;
      TreeControls.Items.AddChildObject(TempNode, Desc, FTempCPointer);
      FTempCPointer := nil;
    end;
    TreeControls.FullExpand;
    TreeControls.Perform(WM_VSCROLL, SB_TOP, 0);
  end;

  PageMenu.TabVisible := Assigned(FMenu);

  PageAction.TabVisible := Assigned(FActions);

  PageControls.TabVisible := (Assigned(FExtraRights) and (FExtraRights.Count > 0));
end;

procedure TUserPermis.UnCheckChild(node: TTreeNode);
var
  child: TTreeNode;
begin
  PTreemenu(node.Data).Selecionado := 0;
  node.ImageIndex                  := 0;
  node.SelectedIndex               := 0;
  child                            := node.GetFirstChild;
  repeat
    if child.HasChildren then
      UnCheckChild(child)
    else
    begin
      PTreemenu(child.Data).Selecionado := 0;
      child.ImageIndex                  := 0;
      child.SelectedIndex               := 0;
    end;
    child := node.GetNextChild(child);
  until child = nil;
end;

procedure TUserPermis.TreeMenuItem( Marca: Boolean );
var
  AbsIdx: Integer;
begin
  if Marca then
    if PTreemenu(TreeMenu.Selected.Data).Selecionado < 2 then
    begin
      if PTreemenu(TreeMenu.Selected.Data).Selecionado = 0 then //marcar
      begin
        AbsIdx := TreeMenu.Selected.AbsoluteIndex;
        while AbsIdx > -1 do
        begin
          PTreemenu(TreeMenu.Items.Item[AbsIdx].Data).Selecionado := 1;
          TreeMenu.Items.Item[AbsIdx].ImageIndex                  := 1;
          TreeMenu.Items.Item[AbsIdx].SelectedIndex               := 1;
          if TreeMenu.Items.Item[AbsIdx].Parent <> nil then
          begin
            AbsIdx := TreeMenu.Items.Item[AbsIdx].Parent.AbsoluteIndex;
            if PTreemenu(TreeMenu.Items.Item[AbsIdx].Data).Selecionado = 2 then
              AbsIdx := -1;
          end
          else
            AbsIdx := -1;
        end;
      end
      else
        if TreeMenu.Selected.HasChildren then
          UnCheckChild(TreeMenu.Selected)
        else
        begin
          PTreemenu(TreeMenu.Selected.Data).Selecionado := 0;
          TreeMenu.Selected.ImageIndex                  := 0;
          TreeMenu.Selected.SelectedIndex               := 0;
        end; //desmarcar
      TreeMenu.Repaint;
    end;
end;

procedure TUserPermis.TreeActionItem(marca: Boolean);
begin
  if not Assigned(FActions) then
    Exit;

  if PTreeAction(TreeAction.Selected.Data).Grupo then
    Exit;
    
  if Marca then
  begin
    if PTreeAction(TreeAction.Selected.Data).Selecionado < 2 then
      if PTreeAction(TreeAction.Selected.Data).Selecionado = 0 then
        PTreeAction(TreeAction.Selected.Data).Selecionado := 1
      else
        PTreeAction(TreeAction.Selected.Data).Selecionado := 0;
    TreeAction.Selected.ImageIndex := PTreeAction(TreeAction.Selected.Data).Selecionado;
    TreeAction.Selected.SelectedIndex := PTreeAction(TreeAction.Selected.Data).Selecionado;
  end;
  TreeAction.Repaint;
end;

procedure TUserPermis.TreeControlItem(marca: Boolean);
begin
  if PTreeControl(TreeControls.Selected.Data).Grupo then
    Exit;
  if Marca then
  begin
    if PTreeControl(TreeControls.Selected.Data).Selecionado < 2 then
      if PTreeControl(TreeControls.Selected.Data).Selecionado = 0 then
        PTreeControl(TreeControls.Selected.Data).Selecionado := 1
      else
        PTreeControl(TreeControls.Selected.Data).Selecionado := 0;
    TreeControls.Selected.ImageIndex := PTreeControl(TreeControls.Selected.Data).Selecionado;
    TreeControls.Selected.SelectedIndex := PTreeAction(TreeControls.Selected.Data).Selecionado;
  end;
  TreeControls.Repaint;
end;

procedure TUserPermis.TreeMenuClick(Sender: TObject);
begin
  if not FChangingTree then
    TreeMenuItem( True );
end;

procedure TUserPermis.BtCancelClick(Sender: TObject);
begin
  Close;
end;

procedure TUserPermis.BtLiberaClick(Sender: TObject);
begin
  Atualiza(True);
end;

procedure TUserPermis.Atualiza( Selec : Boolean );
var
  Contador: Integer;
  Temp:     Integer;
begin
  if Selec then
    Temp := 1
  else
    Temp := 0;

  if PC.ActivePage = PageMenu then
  begin
    for Contador := 0 to TreeMenu.Items.Count - 1 do
      if PTreeMenu(TreeMenu.Items[Contador].Data).Selecionado < 2 then
      begin
        PTreeMenu(TreeMenu.Items[Contador].Data).Selecionado := Temp;
        TreeMenu.Items[Contador].ImageIndex                  := Temp;
        TreeMenu.Items[Contador].SelectedIndex               := Temp;
      end;
    TreeMenu.Repaint;
  end

  else if PC.ActivePage = PageAction then
    begin
      for Contador := 0 to TreeAction.Items.Count - 1 do
        if not PTreeAction(TreeAction.Items[Contador].Data).Grupo then
          if PTreeAction(TreeAction.Items[Contador].Data).Selecionado < 2 then
          begin
            PTreeAction(TreeAction.Items[Contador].Data).Selecionado := Temp;
            TreeAction.Items[Contador].ImageIndex                    := Temp;
            TreeAction.Items[Contador].SelectedIndex                 := Temp;
          end;
      TreeAction.Repaint;
    end

  else begin // tabContols
      for Contador := 0 to TreeControls.Items.Count - 1 do
        if not PTreeControl(TreeControls.Items[Contador].Data).Grupo then
          if PTreeControl(TreeControls.Items[Contador].Data).Selecionado < 2 then
          begin
            PTreeControl(TreeControls.Items[Contador].Data).Selecionado := Temp;
            TreeControls.Items[Contador].ImageIndex                     := Temp;
            TreeControls.Items[Contador].SelectedIndex                  := Temp;
          end;
      TreeControls.Repaint;
    end;
end;


procedure TUserPermis.BtBloqueiaClick(Sender: TObject);
begin
  Atualiza(False);
end;

procedure TUserPermis.FormShow(Sender: TObject);
var
  Contador: Integer;
  Selec:    Integer;
begin
  // Adcionado por Luiz
  SetLength(FListaAction, 0);
  SetLength(FListaMenu, 0);
  SetLength(FListaControl, 0);

  //carrega itens do menu, actions e controles
  CarregaTreeviews;

  // Exibe Permissoes do Usuario
  for Contador := 0 to TreeAction.Items.Count - 1 do
  begin
    DSPermiss.First;
    if DSPermiss.Locate('ObjName', PTreeAction(TreeAction.Items[Contador].Data).MenuName, []) then
      Selec := 1
    else
      Selec := 0;

    PTreeAction(TreeAction.Items[Contador].Data).Selecionado := Selec;
    if not PTreeAction(TreeAction.Items[Contador].Data).Grupo then
    begin
      TreeAction.Items[Contador].ImageIndex    := Selec;
      TreeAction.Items[Contador].SelectedIndex := Selec;
    end;
  end;

  for Contador := 0 to TreeMenu.Items.Count - 1 do
  begin
    DSPermiss.First;
    if DSPermiss.Locate('ObjName', PTreeMenu(TreeMenu.Items[Contador].Data).MenuName, []) then
      Selec := 1
    else
      Selec := 0;

    PTreeMenu(TreeMenu.Items[Contador].Data).Selecionado := Selec;
    TreeMenu.Items[Contador].ImageIndex                  := Selec;
    TreeMenu.Items[Contador].SelectedIndex               := Selec;
  end;

  //Extra Rights
  for Contador := 0 to Pred(TreeControls.Items.Count) do
  begin
    DSPermissEX.First;
    if DSPermissEX.Locate('FormName;ObjName', VarArrayOf([PTreeControl(TreeControls.Items[Contador].Data).FormName, PTreeControl(TreeControls.Items[Contador].Data).CompName]), []) then
      Selec := 1
    else
      Selec := 0;

    PTreeControl(TreeControls.Items[Contador].Data).Selecionado := Selec;
    if not PTreeControl(TreeControls.Items[Contador].Data).Grupo then
    begin
      TreeControls.Items[Contador].ImageIndex    := Selec;
      TreeControls.Items[Contador].SelectedIndex := Selec;
    end;
  end;

  // Exibe Permissoes do Perfil
  if DSPerfil.Active then
  begin
    for Contador := 0 to TreeAction.Items.Count - 1 do
    begin
      DSPerfil.First;
      if DSPerfil.Locate('ObjName', PTreeAction(TreeAction.Items[Contador].Data).MenuName, []) then
      begin
        Selec                                                    := 2;
        PTreeAction(TreeAction.Items[Contador].Data).Selecionado := Selec;
        if not PTreeAction(TreeAction.Items[Contador].Data).Grupo then
        begin
          TreeAction.Items[Contador].ImageIndex    := Selec;
          TreeAction.Items[Contador].SelectedIndex := Selec;
        end;
      end;
    end;

    for Contador := 0 to TreeMenu.Items.Count - 1 do
    begin
      DSPerfil.First;
      if DSPerfil.Locate('ObjName', PTreeMenu(TreeMenu.Items[Contador].Data).MenuName, []) then
      begin
        Selec                                                := 2;
        PTreeMenu(TreeMenu.Items[Contador].Data).Selecionado := Selec;
        TreeMenu.Items[Contador].ImageIndex                  := Selec;
        TreeMenu.Items[Contador].SelectedIndex               := Selec;
      end;
    end;

    //Extra Rights
    for Contador := 0 to Pred(TreeControls.Items.Count) do
    begin
      DSPerfilEX.First;
      if DSPerfilEX.Locate('FormName;ObjName', VarArrayOf([PTreeControl(TreeControls.Items[Contador].Data).FormName, PTreeControl(TreeControls.Items[Contador].Data).CompName]), []) then
      begin
        Selec                                                       := 2;
        PTreeControl(TreeControls.Items[Contador].Data).Selecionado := Selec;
        if not PTreeControl(TreeControls.Items[Contador].Data).Grupo then
        begin
          TreeControls.Items[Contador].ImageIndex    := Selec;
          TreeControls.Items[Contador].SelectedIndex := Selec;
        end;
      end;
    end;
  end;

  TreeAction.Repaint;
  TreeMenu.Repaint;
  FChangingTree := False;
end;

procedure TUserPermis.TreeActionClick(Sender: TObject);
begin
  if not FChangingTree then
    TreeActionItem(True);
end;

procedure TUserPermis.TreeControlsClick(Sender: TObject);
begin
  if not FChangingTree then
    TreeControlItem(True);
end;

procedure TUserPermis.TreeMenuCollapsing(Sender: TObject; Node: TTreeNode; var AllowCollapse: Boolean);
begin
  if (Self.Showing) and (TTreeView(Sender).Focused) then
    FChangingTree := True;
end;

procedure TUserPermis.TreeMenuKeyPress(Sender: TObject; var Key: char);
begin
  if Key = ' ' then
  begin
    TTreeView(Sender).OnClick(Sender);
    Key := #0;
  end;
end;

procedure TUserPermis.TreeMenuMouseUp(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
begin
  FChangingTree := False;
end;

procedure TUserPermis.FormDestroy(Sender: TObject);
var
  Contador: Integer;
begin
  // Adicionado por Luiz 18/01/06
  if Assigned(DSPermiss) then
    FreeAndNil(DSPermiss);

  if Assigned(DSPermissEX) then
    FreeAndNil(DSPermissEX);

  if Assigned(DSPerfil) then
    FreeAndNil(DSPerfil);

  if Assigned(DSPerfilEX) then
    FreeAndNil(DSPerfilEX);

  if Assigned(FTempLista) then
    FreeAndNil(FTempLista);

  for Contador := 0 to High(FListaMenu) do
    Dispose(FListaMenu[Contador]);

  for Contador := 0 to High(FListaAction) do
    Dispose(FListaAction[Contador]);

  for Contador := 0 to High(FListaControl) do
    Dispose(FListaControl[Contador]);
end;

end.

